package com;

import com.CGLIBProxy.StaticProxy.AffairTx;
import com.CGLIBProxy.pojo.User;
import com.CGLIBProxy.service.impl.UserServiceImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;

import java.lang.reflect.Method;

/**
 * @author cc
 * @date 2021/8/13 11:59
 * @Description 业务需求：老板说这个实现类没得接口，也不能写接口，这时候就需要cglib来实现
 * cglib的核心思想：给目标类实现一个子类，这个子类就是代理类
 */

public class CgLibProxyProxy {
    @Test
    public void Test1(){
        //CGLIB工具类
        Enhancer enhancer = new Enhancer();
        //设置给哪个类设置为子类
        enhancer.setSuperclass(UserServiceImpl.class);


        //设置回调的，就是生成木匾类的子对象 并且设置拦截器
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                AffairTx.commit();
                //实现父类的方法
                Object o1 = methodProxy.invokeSuper(o, objects);
                AffairTx.close();
                return o1;
            }
        });
        //创建子类（代理类）
        UserServiceImpl us = (UserServiceImpl) enhancer.create();
        int count1 = us.addUser(new User("TEst", 99));
        System.out.println("新增成功:"+count1);

        System.out.println("==================================================");

        int count2 = us.delectUser("我把test删除了");
        System.out.println("删除成功:"+count2);

    }
}
